package tech.aistar.day10;

import tech.aistar.day08.equal.Book;

import java.util.*;

/**
 * 本类用来演示:
 *
 * @author: success
 * @date: 2021/3/17 3:09 下午
 */
public class HashSetDemo {
    public static void main(String[] args) {
        //不可重复...
        //1. 将图书对象放入到set容器中
        //2. 会在底层调用这个图书对象的hashcode方法 - 得到一个哈希值
        //3. 根据这个哈希值,JVM就会给这个对象在这个容器中分配一个地址[空间]
        //4. 当后面再次将后面的图书对象放入到这个容器的时候,仍然会先调用这个图书对象的hashcode方法
        //   4-1. 如果这个哈希值在这之前从来没有出现过,就会直接分配地址[空间]
        //   4-2. 如果这个哈希值在这之前曾经出现过,此时还不能够判断就是同一个对象 - 哈希冲突了 - 哈希碰撞
        //   4-3. 当出现哈希碰撞之后,仍然还会再进行equals方法比较,如果返回true,真的是同一个对象了,拒绝添加了.

        //提供hashCode方法的目的 - 提高程序的性能.
        Set<Book> sets = new HashSet<>();
        Book b5 = new Book(5,"1005","西游记",600.0d);
        Book b6 = new Book(6,"1005","西游记",600.0d);
        Book b7 = new Book(7,"1005","西游记",600.0d);

        Book b8 = new Book(5,"1005","西游记2",600.0d);
        //Book -> equals和hashcode -> id和isbn

        //sets.add(HashDemo5);
        sets.add(b6);
        sets.add(b7);
        sets.add(b8);

        //排序 - 将sets集合中的数据放入到list集合中
        //然后再根据list集合进行排序
        List<Book> bookList = new ArrayList<>();
        bookList.addAll(sets);

        System.out.println(bookList);

        for (Book b : sets) {
            System.out.println(b);
        }

        Iterator<Book> iter = sets.iterator();
        while(iter.hasNext()){
            Book b = iter.next();
            System.out.println(b);
        }

        String s1 = "Ma";
        String s2 = "NB";
        System.out.println(s1.hashCode());//2484
        System.out.println(s2.hashCode());//2484

        System.out.println(s1.equals(s2));//false

    }
}
